home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_096 / animplayer / filerequest.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  31KB  |  1,017 lines

  1. /****************************************************************************
  2.  *
  3.  *  FileRequest() - File Name Requester
  4.  *
  5.  *  By Kevin Lee Clague
  6.  *     Randy Finch
  7.  *     Martin Hash
  8.  *
  9.  *  Copyright (C) 1987. All rights reserved.
  10.  *
  11.  *  This program is freely distributable as long as this copyright notice
  12.  *  is retained. It intended for personal, non-commercial use.
  13.  *
  14.  *  This file name requester is modeled after Deluxe Paints file name
  15.  *  requester. The dimensions/locations of all borders, gadgets and text were
  16.  *  arrived at empirically. Besides being a great program, Deluxe Paint is a
  17.  *  trade mark of Electronics Arts.
  18.  *
  19.  *  LAST EDITED
  20.  *     Martin Hash            15 Aug 1987
  21.  *
  22.  ***************************************************************************/
  23.  
  24. #include "df1:Requester.h"
  25.  
  26. extern struct IntuitionBase *IntuitionBase;
  27.  
  28. BOOL WaitRequester();
  29. void InitFNR(), SetNewDrawer(), SetNewFile(), ListDir(), AttachList();
  30. void ScrollList(), PotScrollList(), ThrowTrailing();
  31. void ChangeDevice(), ToUpper();
  32. char *strrchr();
  33. struct ViewPort *ViewPortAddress();
  34.  
  35. #define STRINGSIZE  40
  36. #define PATHNAMELEN 80
  37. #define MIN(a,b)    ((a)<(b)?(a):(b))
  38.  
  39. struct Requester FileRequester;
  40.  
  41. UBYTE *FRFullPath;
  42. struct IntuiMessage *message;
  43. struct Window *FRWindow;
  44.  
  45. struct FileInfoBlock FileInfo;
  46. USHORT FileCount;                     /* Number of files in current dir */
  47. UBYTE  FileListEntry[MAXFILES][40];   /* File (dir) names in current dir */
  48. TEXT   GetUser[PATHNAMELEN];
  49. TEXT   spaces30[] = "                              ";
  50. UBYTE *FileExt;
  51.  
  52. USHORT FirstFile;
  53.  
  54. /****************************************************************************
  55.  *                The Gadget String
  56.  ***************************************************************************/
  57. /******************************
  58.  * The File Name Gadget stuff *
  59.  *****************************/
  60. struct IntuiText FileText =
  61.   {
  62.   0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  63.   -46,0,                  /* LeftEdge,TopEdge */
  64.   NULL,                   /* ITextFont */
  65.   "File",                 /* IText */
  66.   NULL                    /* NextText */
  67.   };
  68.  
  69. UBYTE FileName[STRINGSIZE];
  70. UBYTE Backup[STRINGSIZE];
  71. struct StringInfo FileString = {
  72.     FileName,               /* Buffer */
  73.     Backup,                 /* UndoBuffer */
  74.     0,                       /* BufferPos */
  75.     32,                      /* MaxChars  */
  76.     0,                       /* DispPos */
  77.     0,0,0,0,0,NULL,0,NULL    /* maintained by Intuition */
  78.   };
  79.  
  80. struct Gadget FileGadget =
  81.   { /* File string */
  82.   NULL,                    /* NextGadget */
  83.   67,113,                  /* LeftEdge, TopEdge */
  84.   185,8,                   /* Width, Height */
  85.   GADGHCOMP,               /* Flags */
  86.   0,                       /* Activation */
  87.   STRGADGET|REQGADGET,     /* GadgetType */
  88.   NULL,                    /* GadgetRender */
  89.   NULL,                    /* SelectRender */
  90.   &FileText,               /* GadgetText */
  91.   0,                       /* MutualExclude */
  92.   (APTR)&FileString,             /* SpecialInfo */
  93.   NULL,                    /* GadgetID */
  94.   NULL                     /* UserData */
  95.   };
  96.  
  97. /********************************
  98.  * The Drawer Name Gadget stuff *
  99.  *******************************/
  100. struct IntuiText DrawerText =
  101.   {
  102.   0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  103.   -62,0,                  /* LeftEdge,TopEdge */
  104.   NULL,                   /* ITextFont */
  105.   "Drawer:",              /* IText */
  106.   NULL                    /* NextText */
  107.   };
  108.  
  109. UBYTE DrawerName[PATHNAMELEN];
  110. UBYTE Backup2[PATHNAMELEN];
  111. struct StringInfo DrawerString = {
  112.     DrawerName,             /* Buffer */
  113.     Backup2,                /* UndoBuffer */
  114.     0,                       /* BufferPos */
  115.     PATHNAMELEN,                      /* MaxChars  */
  116.     0,                       /* DispPos*/
  117.     0,0,0,0,0,NULL,0,NULL    /* maintained by Intuition*/
  118.   };
  119.  
  120. struct Gadget DrawerGadget =
  121.   { /* Drawer string */
  122.   &FileGadget,             /* NextGadget */
  123.   67,98,                   /* LeftEdge, TopEdge */
  124.   185,8,                   /* Width, Height */
  125.   GADGHCOMP,               /* Flags */
  126.   RELVERIFY,               /* Activation */
  127.   STRGADGET|REQGADGET,     /* GadgetType */
  128.   NULL,                    /* GadgetRender */
  129.   NULL,                    /* SelectRender */
  130.   &DrawerText,             /* GadgetText */
  131.   0,                       /* MutualExclude */
  132.   (APTR)&DrawerString,           /* SpecialInfo */
  133.   DRAWERGADGET,            /* GadgetID */
  134.   NULL                     /* UserData */
  135.   };
  136.  
  137. /****************************************
  138.  * The File list selection Gadget stuff *
  139.  ***************************************/
  140. UBYTE PickNames[8][STRINGSIZE];
  141. struct IntuiText FileList[] =
  142.   {
  143.     {
  144.     0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  145.     0,0,                    /* LeftEdge,TopEdge */
  146.     NULL,                   /* ITextFont */
  147.     &PickNames[0][0],       /* IText */
  148.     NULL                    /* NextText */
  149.     },
  150.     {
  151.     0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  152.     0,0,                    /* LeftEdge,TopEdge */
  153.     NULL,                   /* ITextFont */
  154.     &PickNames[1][0],       /* IText */
  155.     NULL                    /* NextText */
  156.     },
  157.     {
  158.     0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  159.     0,0,                    /* LeftEdge,TopEdge */
  160.     NULL,                   /* ITextFont */
  161.     &PickNames[2][0],       /* IText */
  162.     NULL                    /* NextText */
  163.     },
  164.     {
  165.     0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  166.     0,0,                    /* LeftEdge,TopEdge */
  167.     NULL,                   /* ITextFont */
  168.     &PickNames[3][0],       /* IText */
  169.     NULL                    /* NextText */
  170.     },
  171.     {
  172.     0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  173.     0,0,                    /* LeftEdge,TopEdge */
  174.     NULL,                   /* ITextFont */
  175.     &PickNames[4][0],       /* IText */
  176.     NULL                    /* NextText */
  177.     },
  178.     {
  179.     0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  180.     0,0,                    /* LeftEdge,TopEdge */
  181.     NULL,                   /* ITextFont */
  182.     &PickNames[5][0],       /* IText */
  183.     NULL                    /* NextText */
  184.     },
  185.     {
  186.     0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  187.     0,0,                    /* LeftEdge,TopEdge */
  188.     NULL,                   /* ITextFont */
  189.     &PickNames[6][0],       /* IText */
  190.     NULL                    /* NextText */
  191.     },
  192.     {
  193.     0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  194.     0,0,                    /* LeftEdge,TopEdge */
  195.     NULL,                   /* ITextFont */
  196.     &PickNames[7][0],       /* IText */
  197.     NULL                    /* NextText */
  198.     }
  199.   };
  200.  
  201. struct Gadget FileListGadget[] =
  202.   {
  203.     { /* File name selection 0 */
  204.     &FileListGadget[1],      /* NextGadget */
  205.     5,14,                    /* LeftEdge, TopEdge */
  206.     240,8,                   /* Width, Height */
  207.     GADGHCOMP,               /* Flags */
  208.     RELVERIFY,               /* Activation */
  209.     BOOLGADGET|REQGADGET,    /* GadgetType */
  210.     NULL,                    /* GadgetRender */
  211.     NULL,                    /* SelectRender */
  212.     &FileList[0],            /* GadgetText */
  213.     0,                       /* MutualExclude */
  214.     NULL,                    /* SpecialInfo */
  215.     FILE0GADGET,             /* GadgetID */
  216.     NULL                     /* UserData */
  217.     },
  218.     { /* File name selection 1 */
  219.     &FileListGadget[2],      /* NextGadget */
  220.     5,24,                    /* LeftEdge, TopEdge */
  221.     240,8,                   /* Width, Height */
  222.     GADGHCOMP,               /* Flags */
  223.     RELVERIFY,               /* Activation */
  224.     BOOLGADGET|REQGADGET,    /* GadgetType */
  225.     NULL,                    /* GadgetRender */
  226.     NULL,                    /* SelectRender */
  227.     &FileList[1],            /* GadgetText */
  228.     0,                       /* MutualExclude */
  229.     NULL,                    /* SpecialInfo */
  230.     FILE1GADGET,             /* GadgetID */
  231.     NULL                     /* UserData */
  232.     },
  233.     { /* File name selection 2 */
  234.     &FileListGadget[3],      /* NextGadget */
  235.     5,34,                    /* LeftEdge, TopEdge */
  236.     240,8,                   /* Width, Height */
  237.     GADGHCOMP,               /* Flags */
  238.     RELVERIFY,               /* Activation */
  239.     BOOLGADGET|REQGADGET,    /* GadgetType */
  240.     NULL,                    /* GadgetRender */
  241.     NULL,                    /* SelectRender */
  242.     &FileList[2],            /* GadgetText */
  243.     0,                       /* MutualExclude */
  244.     NULL,                    /* SpecialInfo */
  245.     FILE2GADGET,             /* GadgetID */
  246.     NULL                     /* UserData */
  247.     },
  248.     { /* File name selection 3 */
  249.     &FileListGadget[4],      /* NextGadget */
  250.     5,44,                    /* LeftEdge, TopEdge */
  251.     240,8,                   /* Width, Height */
  252.     GADGHCOMP,               /* Flags */
  253.     RELVERIFY,               /* Activation */
  254.     BOOLGADGET|REQGADGET,    /* GadgetType */
  255.     NULL,                    /* GadgetRender */
  256.     NULL,                    /* SelectRender */
  257.     &FileList[3],            /* GadgetText */
  258.     0,                       /* MutualExclude */
  259.     NULL,                    /* SpecialInfo */
  260.     FILE3GADGET,             /* GadgetID */
  261.     NULL                     /* UserData */
  262.     },
  263.     { /* File name selection 4 */
  264.     &FileListGadget[5],      /* NextGadget */
  265.     5,54,                    /* LeftEdge, TopEdge */
  266.     240,8,                   /* Width, Height */
  267.     GADGHCOMP,               /* Flags */
  268.     RELVERIFY,               /* Activation */
  269.     BOOLGADGET|REQGADGET,    /* GadgetType */
  270.     NULL,                    /* GadgetRender */
  271.     NULL,                    /* SelectRender */
  272.     &FileList[4],            /* GadgetText */
  273.     0,                       /* MutualExclude */
  274.     NULL,                    /* SpecialInfo */
  275.     FILE4GADGET,             /* GadgetID */
  276.     NULL                     /* UserData */
  277.     },
  278.     { /* File name selection 5 */
  279.     &FileListGadget[6],      /* NextGadget */
  280.     5,64,                    /* LeftEdge, TopEdge */
  281.     240,8,                   /* Width, Height */
  282.     GADGHCOMP,               /* Flags */
  283.     RELVERIFY,               /* Activation */
  284.     BOOLGADGET|REQGADGET,    /* GadgetType */
  285.     NULL,                    /* GadgetRender */
  286.     NULL,                    /* SelectRender */
  287.     &FileList[5],            /* GadgetText */
  288.     0,                       /* MutualExclude */
  289.     NULL,                    /* SpecialInfo */
  290.     FILE5GADGET,             /* GadgetID */
  291.     NULL                     /* UserData */
  292.     },
  293.     { /* File name selection 6 */
  294.     &FileListGadget[7],      /* NextGadget */
  295.     5,74,                    /* LeftEdge, TopEdge */
  296.     240,8,                   /* Width, Height */
  297.     GADGHCOMP,               /* Flags */
  298.     RELVERIFY,               /* Activation */
  299.     BOOLGADGET|REQGADGET,    /* GadgetType */
  300.     NULL,                    /* GadgetRender */
  301.     NULL,                    /* SelectRender */
  302.     &FileList[6],            /* GadgetText */
  303.     0,                       /* MutualExclude */
  304.     NULL,                    /* SpecialInfo */
  305.     FILE6GADGET,             /* GadgetID */
  306.     NULL                     /* UserData */
  307.     },
  308.     { /* File name selection 7 */
  309.     &DrawerGadget,           /* NextGadget */
  310.     5,84,                    /* LeftEdge, TopEdge */
  311.     240,8,                   /* Width, Height */
  312.     GADGHCOMP,               /* Flags */
  313.     RELVERIFY,               /* Activation */
  314.     BOOLGADGET|REQGADGET,    /* GadgetType */
  315.     NULL,                    /* GadgetRender */
  316.     NULL,                    /* SelectRender */
  317.     &FileList[7],            /* GadgetText */
  318.     0,                       /* MutualExclude */
  319.     NULL,                    /* SpecialInfo */
  320.     FILE7GADGET,             /* GadgetID */
  321.     NULL                     /* UserData */
  322.     }
  323.   };
  324. /********************************
  325.  * The Load Button gadget stuff *
  326.  *******************************/
  327. SHORT ButtonPoints1[] =
  328.   {
  329.   -2, 11,
  330.   66, 11,
  331.   66, -1
  332.   };
  333. struct Border ButtonBorder1 =
  334.   {
  335.   0,0,
  336.   0,1,JAM1,
  337.   3,
  338.   &ButtonPoints1[0],
  339.   NULL
  340.   };
  341. SHORT ButtonPoints0[] =
  342.   {
  343.   -3, -2,
  344.   65, -2,
  345.   65, 10,
  346.   -3, 10,
  347.   -3, -2
  348.   };
  349. struct Border ButtonBorder0 =
  350.   {
  351.   0,0,
  352.   0,1,JAM1,
  353.   5,
  354.   &ButtonPoints0[0],
  355.   &ButtonBorder1
  356.   };
  357.  
  358. struct IntuiText LoadText =
  359.   {
  360.   0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  361.   0,0,                    /* LeftEdge,TopEdge */
  362.   NULL,                   /* ITextFont */
  363.   NULL,                   /* IText */
  364.   NULL                    /* NextText */
  365.   };
  366.  
  367. struct Gadget LoadGadget =
  368.   { /* Load button */
  369.   &FileListGadget[0],      /* NextGadget */
  370.   14,148,                  /* LeftEdge, TopEdge */
  371.   64,8,                    /* Width, Height */
  372.   GADGHCOMP,               /* Flags */
  373.   GADGIMMEDIATE|ENDGADGET, /* Activation */
  374.   BOOLGADGET|REQGADGET,    /* GadgetType */
  375.   (APTR) &ButtonBorder0,   /* GadgetRender */
  376.   NULL,                    /* SelectRender */
  377.   &LoadText,               /* GadgetText */
  378.   0,                       /* MutualExclude */
  379.   NULL,                    /* SpecialInfo */
  380.   LOADGADGET,              /* GadgetID */
  381.   NULL                     /* UserData */
  382.   };
  383.  
  384. /**********************************
  385.  * The Cancel Button gadget stuff *
  386.  *********************************/
  387. struct IntuiText CancelText =
  388.   {
  389.   0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  390.   0,0,                    /* LeftEdge,TopEdge */
  391.   NULL,                   /* ITextFont */
  392.   " Cancel",               /* IText */
  393.   NULL                    /* NextText */
  394.   };
  395.  
  396. struct Gadget CancelGadget =
  397.   { /* Cancel button */
  398.   &LoadGadget,             /* NextGadget */
  399.   187,148,                 /* LeftEdge, TopEdge */
  400.   64,8,                    /* Width, Height */
  401.   GADGHCOMP,               /* Flags */
  402.   GADGIMMEDIATE|ENDGADGET, /* Activation */
  403.   BOOLGADGET|REQGADGET,    /* GadgetType */
  404.   (APTR) &ButtonBorder0,   /* GadgetRender */
  405.   NULL,                    /* SelectRender */
  406.   &CancelText,             /* GadgetText */
  407.   0,                       /* MutualExclude */
  408.   NULL,                    /* SpecialInfo */
  409.   CANCELGADGET,            /* GadgetID */
  410.   NULL                     /* UserData */
  411.   };
  412.  
  413.  
  414. /******************************************
  415.  * The DF0:, DF1:, and User Button Gadget *
  416.  ******************************************/
  417.  
  418. struct IntuiText DF0Text =
  419.   {
  420.   0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  421.   0,0,                    /* LeftEdge,TopEdge */
  422.   NULL,                   /* ITextFont */
  423.   "DF0:",                 /* IText */
  424.   NULL                    /* NextText */
  425.   };
  426.  
  427. struct IntuiText DF1Text =
  428.   {
  429.   0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  430.   0,0,                    /* LeftEdge,TopEdge */
  431.   NULL,                   /* ITextFont */
  432.   "DF1:",                 /* IText */
  433.   NULL                    /* NextText */
  434.   };
  435.  
  436. struct IntuiText UserText =
  437.   {
  438.   0,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  439.   0,0,                    /* LeftEdge,TopEdge */
  440.   NULL,                   /* ITextFont */
  441.   "HD:     ",             /* IText */
  442.   NULL                    /* NextText */
  443.   };
  444.  
  445. struct Gadget DFGadget[] =
  446.   {
  447.   {
  448.   &CancelGadget,           /* NextGadget */
  449.   14,130,                  /* LeftEdge, TopEdge */
  450.   64,8,                    /* Width, Height */
  451.   GADGHNONE,               /* Flags */
  452.   RELVERIFY,               /* Activation */
  453.   BOOLGADGET|REQGADGET,    /* GadgetType */
  454.   (APTR) &ButtonBorder0,   /* GadgetRender */
  455.   NULL,                    /* SelectRender */
  456.   &DF0Text,                /* GadgetText */
  457.   0,                       /* MutualExclude */
  458.   NULL,                    /* SpecialInfo */
  459.   DF0GADGET,               /* GadgetID */
  460.   NULL                     /* UserData */
  461.   },
  462.   {
  463.   &DFGadget[0],            /* NextGadget */
  464.   101,130,                 /* LeftEdge, TopEdge */
  465.   64,8,                    /* Width, Height */
  466.   GADGHNONE,               /* Flags */
  467.   RELVERIFY,               /* Activation */
  468.   BOOLGADGET|REQGADGET,    /* GadgetType */
  469.   (APTR) &ButtonBorder0,   /* GadgetRender */
  470.   NULL,                    /* SelectRender */
  471.   &DF1Text,                /* GadgetText */
  472.   0,                       /* MutualExclude */
  473.   NULL,                    /* SpecialInfo */
  474.   DF1GADGET,               /* GadgetID */
  475.   NULL                     /* UserData */
  476.   },
  477.   {
  478.   &DFGadget[1],            /* NextGadget */
  479.   187,130,                 /* LeftEdge, TopEdge */
  480.   64,8,                    /* Width, Height */
  481.   GADGHNONE,               /* Flags */
  482.   RELVERIFY,               /* Activation */
  483.   BOOLGADGET|REQGADGET,    /* GadgetType */
  484.   (APTR) &ButtonBorder0,   /* GadgetRender */
  485.   NULL,                    /* SelectRender */
  486.   &UserText,               /* GadgetText */
  487.   0,                       /* MutualExclude */
  488.   NULL,                    /* SpecialInfo */
  489.   USERGADGET,              /* GadgetID */
  490.   NULL                     /* UserData */
  491.   } };
  492.  
  493.  
  494. /***********************************************
  495.  * The Scroll Selection List up (arrow) gadget *
  496.  **********************************************/
  497. UWORD UpArrowData[15] = {
  498.    0xfffc,
  499.    0xfcfc,
  500.    0xf87c,
  501.    0xf03c,
  502.    0xe01c,
  503.    0xc00c,
  504.    0x8004,
  505.    0xfcfc,
  506.    0xfcfc,
  507.    0xfcfc,
  508.    0xfcfc,
  509.    0xfcfc,
  510.    0xfcfc,
  511.    0xfffc
  512. };
  513.  
  514. struct Image UpArrow =
  515.   {
  516.    0,0,
  517.    14,
  518.    14,
  519.    1,
  520.    &UpArrowData[0],
  521.    0x1, 0x0,
  522.    NULL
  523.    };
  524.  
  525. struct Gadget UpGadget =
  526.   { /* Up a file gadget */
  527.   &DFGadget[2],            /* NextGadget */
  528.   247,13,                  /* LeftEdge, TopEdge */
  529.   12,15,                   /* Width, Height */
  530.   GADGIMAGE|GADGHNONE,     /* Flags */
  531.   GADGIMMEDIATE,           /* Activation */
  532.   BOOLGADGET|REQGADGET,    /* GadgetType */
  533.   (APTR) &UpArrow,         /* GadgetRender */
  534.   NULL,                    /* SelectRender */
  535.   NULL,                    /* GadgetText */
  536.   0,                       /* MutualExclude */
  537.   NULL,                    /* SpecialInfo */
  538.   UPGADGET,                /* GadgetID */
  539.   NULL                     /* UserData */
  540.   };
  541. /*************************************************
  542.  * The Scroll Selection List down (arrow) gadget *
  543.  ************************************************/
  544. UWORD DownArrowData[15] = {
  545.    0xfffc,
  546.    0xfcfc,
  547.    0xfcfc,
  548.    0xfcfc,
  549.    0xfcfc,
  550.    0xfcfc,
  551.    0xfcfc,
  552.    0x8004,
  553.    0xc00c,
  554.    0xe01c,
  555.    0xf03c,
  556.    0xf87c,
  557.    0xfcfc,
  558.    0xfffc
  559. };
  560.  
  561. struct Image DownArrow =
  562.   {
  563.    0,0,
  564.    14,
  565.    14,
  566.    1,
  567.    &DownArrowData[0],
  568.    0x1, 0x0,
  569.    NULL
  570.    };
  571.  
  572. struct Gadget DownGadget =
  573.   { /* Down a file gadget */
  574.   &UpGadget,               /* NextGadget */
  575.   247,79,                  /* LeftEdge, TopEdge */
  576.   12,15,                   /* Width, Height */
  577.   GADGIMAGE|GADGHNONE,     /* Flags */
  578.   GADGIMMEDIATE,           /* Activation */
  579.   BOOLGADGET|REQGADGET,    /* GadgetType */
  580.   (APTR) &DownArrow,       /* GadgetRender */
  581.   NULL,                    /* SelectRender */
  582.   NULL,                    /* GadgetText */
  583.   0,                       /* MutualExclude */
  584.   NULL,                    /* SpecialInfo */
  585.   DOWNGADGET,              /* GadgetID */
  586.   NULL                     /* UserData */
  587.   };
  588.  
  589. /***************************************************
  590.  * The Scroll Selection list up down Potentiometer *
  591.  **************************************************/
  592. struct PropInfo KnobInfo =
  593.   {
  594.   AUTOKNOB | FREEVERT | PROPBORDERLESS,
  595.   0,
  596.   0, /* VertPot */
  597.   0,
  598.   0x7fff, /* VertBody */
  599.   0,0,0,0,0,0
  600.   };
  601.  
  602. struct Image KnobImage =
  603.   {
  604.   0,0,
  605.   0,0,0,
  606.   NULL,
  607.   0,0,
  608.   NULL
  609.   };
  610.  
  611. struct Gadget PotGadget =
  612.   { /* Potentiometer file gadget */
  613.   &DownGadget,             /* NextGadget */
  614.   247,28,                  /* LeftEdge, TopEdge */
  615.   14,50,                   /* Width, Height */
  616.   GADGHNONE,               /* Flags */
  617.   RELVERIFY,               /* Activation */
  618.   PROPGADGET|REQGADGET,    /* GadgetType */
  619.   (APTR) &KnobImage,       /* GadgetRender */
  620.   NULL,                    /* SelectRender */
  621.   NULL,                    /* GadgetText */
  622.   0,                       /* MutualExclude */
  623.   (APTR)&KnobInfo,               /* SpecialInfo */
  624.   POTGADGET,               /* GadgetID */
  625.   NULL                     /* UserData */
  626.   };
  627. /***************************************************************************
  628. *                  Other Requester structures                              *
  629. ***************************************************************************/
  630. struct IntuiText HeadingText =
  631.   {
  632.   2,1, JAM2,              /* FrontPen, BackPen, DrawMode */
  633.   4,3,                    /* LeftEdge,TopEdge */
  634.   NULL,                   /* ITextFont */
  635.   NULL,                   /* IText */
  636.   NULL                    /* NextText */
  637.   };
  638.  
  639. SHORT Requester0Points[] = {
  640.   2,1,
  641.   261,1,
  642.   261,162,
  643.   2,162,
  644.   2,1
  645.   };
  646. struct Border Requester0Border = {
  647.   0,0,
  648.   0,1,JAM1,
  649.   5,
  650.   &Requester0Points[0],
  651.   NULL
  652.   };
  653.  
  654. SHORT Requester1Points[] = {
  655.   2,12,
  656.   261,12
  657.   };
  658. struct Border Requester1Border = {
  659.   0,0,
  660.   0,1,JAM1,
  661.   2,
  662.   &Requester1Points[0],
  663.   &Requester0Border
  664.   };
  665.  
  666. SHORT Requester2Points[] = {
  667.   2,93,
  668.   261,93
  669.   };
  670. struct Border Requester2Border = {
  671.   0,0,
  672.   0,1,JAM1,
  673.   2,
  674.   &Requester2Points[0],
  675.   &Requester1Border
  676.   };
  677.  
  678. SHORT Requester3Points[] = {
  679.   246,12,
  680.   246,93,
  681.   246,78,
  682.   261,78,
  683.   261,27,
  684.   247,27
  685.   };
  686. struct Border Requester3Border = {
  687.   0,0,
  688.   0,1,JAM1,
  689.   6,
  690.   &Requester3Points[0],
  691.   &Requester2Border
  692.   };
  693.  
  694. /****************************************************************************
  695.  *                     The Code part of the requester
  696.  ***************************************************************************/
  697. BOOL FileRequest(FileType,Action,FullName,window,FileExtension)
  698.   UBYTE *FileType;
  699.   UBYTE *Action;
  700.   UBYTE *FullName;
  701.   struct Window *window;
  702.   UBYTE *FileExtension;
  703. {
  704.   char *StrPtr;
  705.   BOOL   RetCode;
  706.   struct ViewPort *viewport;
  707.   struct ColorMap *colormap;
  708.   int color0, color1, color2, comp0, comp1, count;
  709.  
  710.   window->Flags |= RMBTRAP;
  711.   FRFullPath = FullName;
  712.   FRWindow = window;
  713.   FileExt = FileExtension;
  714.   HeadingText.IText = FileType; /* Center requester title */
  715.   HeadingText.LeftEdge = (256-IntuiTextLength(&HeadingText))/2;
  716.   LoadText.IText = Action;
  717.  
  718.   InitFNR();
  719.  
  720.   if (StrPtr = strrchr( FRFullPath, '/' )) {    /* separate path */
  721.      strcpy( FileString.Buffer, StrPtr+1 );
  722.      *StrPtr = '\0';
  723.   }
  724.   else if (StrPtr = strrchr( FRFullPath, ':' )) {
  725.      strcpy( FileString.Buffer, StrPtr+1 );
  726.      *(StrPtr+1) = '\0';
  727.   }
  728.   else {
  729.      *FileString.Buffer   = '\0';
  730.      *DrawerString.Buffer = '\0';
  731.      *FRFullPath = '\0';
  732.   }
  733.   strcpy( DrawerString.Buffer, FRFullPath );
  734.  
  735.   ListDir( FRFullPath );
  736.  
  737.   viewport = ViewPortAddress( window );
  738.   colormap = viewport->ColorMap;
  739.   count = 1<<(viewport->RasInfo->BitMap->Depth);
  740.   color0 = GetRGB4( colormap, 0 );
  741.   color1 = GetRGB4( colormap, 1 );
  742.   color2 = GetRGB4( colormap, 2 );
  743.   comp1 = GetRGB4( colormap, count-2 );
  744.   comp0 = GetRGB4( colormap, count-1 );
  745.  
  746.   SetRGB4( viewport, 0, 0, 0, 0 );
  747.   SetRGB4( viewport, 1, 15, 15, 15 );
  748.   SetRGB4( viewport, 2, 15, 0, 0 );
  749.   SetRGB4( viewport, count-2, 0, 0, 0 );
  750.   SetRGB4( viewport, count-1, 15, 15, 15 );
  751.  
  752.   /* Put new user device in device gadget */
  753.   strcpy(GetUser, FRFullPath);
  754.   if (StrPtr = strrchr(GetUser, ':'))
  755.      {
  756.      *(StrPtr+1) = '\0';
  757.      ToUpper(GetUser);
  758.      if (strcmp(GetUser,DF0Text.IText) != 0 && strcmp(GetUser,DF1Text.IText) != 0 && strlen(GetUser) <= 8)
  759.         strcpy(UserText.IText, GetUser);
  760.      }
  761.   Request(&FileRequester,FRWindow);
  762.   RetCode = WaitRequester();         /* do everything till Cancel or Load */
  763.  
  764.   SetRGB4( viewport, 0, (color0>>8)&0xF, (color0>>4)&0xF, color0&0xF );
  765.   SetRGB4( viewport, 1, (color1>>8)&0xF, (color1>>4)&0xF, color1&0xF );
  766.   SetRGB4( viewport, 2, (color2>>8)&0xF, (color2>>4)&0xF, color2&0xF );
  767.   SetRGB4( viewport, count-2, (comp1>>8)&0xF, (comp1>>4)&0xF, comp1&0xF );
  768.   SetRGB4( viewport, count-1, (comp0>>8)&0xF, (comp0>>4)&0xF, comp0&0xF );
  769.   window->Flags &= (0xFFFFFFFF^RMBTRAP);
  770.  
  771.   ThrowTrailing( FileString.Buffer );
  772.   if (strlen( FileString.Buffer ) > 0 && RetCode) {
  773.      if (FRFullPath[strlen(FRFullPath)-1] != ':')
  774.         strcat( FRFullPath, "/" );
  775.      strcat( FRFullPath, FileString.Buffer );
  776.      return TRUE;
  777.   }
  778.   return FALSE;
  779. } /* LoadRequest */
  780.  
  781. /*
  782.  *  Init the file name requester
  783.  */
  784. void InitFNR()
  785. {
  786.   InitRequester(&FileRequester);
  787.   FileRequester.LeftEdge  = 6;
  788.   FileRequester.TopEdge   = 12;
  789.   FileRequester.Width     = 264;
  790.   FileRequester.Height    = 164;
  791.   FileRequester.ReqGadget = &PotGadget;
  792.   FileRequester.ReqText   = &HeadingText;
  793.   FileRequester.BackFill  = 1;
  794.   FileRequester.Flags     = 0;
  795.   FileRequester.ReqBorder = &Requester3Border;
  796. } /* InitFNR */
  797.  
  798. /*
  799.  *  WaitRequester - List dirs, scroll, and set drawer and file strings until
  800.  *                  one of the LOAD(SAVE) or CANCEL buttons pushed.
  801.  */
  802. BOOL WaitRequester()
  803. {
  804.   ULONG  class = GADGETDOWN;
  805.   USHORT choice = CANCELGADGET;
  806.   struct Gadget *gadget;
  807.  
  808.   while (class != REQCLEAR)
  809.     {
  810.     if ((message=(struct IntuiMessage *) GetMsg(FRWindow->UserPort)) == 0L)
  811.       {
  812.       Wait(1L<<FRWindow->UserPort->mp_SigBit);
  813.       continue;
  814.       }
  815.     class  = message->Class;
  816.     gadget = (struct Gadget *) message->IAddress;
  817.     ReplyMsg(message);
  818.     switch (class)
  819.       {
  820.       case GADGETDOWN:
  821.            switch (gadget->GadgetID >> CLASSBITS)
  822.              {
  823.              case UPDOWNCLASS:
  824.                   ScrollList(gadget);      /* scroll up/down 1 file */
  825.                   break;
  826.              case BUTTONCLASS:             /* LOAD or CANCEL */
  827.                   choice = gadget->GadgetID & GADGETNUM;
  828.              }
  829.       case GADGETUP:
  830.            switch (gadget->GadgetID >> CLASSBITS)
  831.              {
  832.              case UPDOWNCLASS:             /* Potentiometer scroll */
  833.                   PotScrollList(gadget);
  834.                   break;
  835.              case STRINGCLASS:             /* They typed drawer name in */
  836.                   ThrowTrailing(DrawerString.Buffer);
  837.                   strcpy(FRFullPath,DrawerString.Buffer);
  838.                   SetNewFile(&FileGadget,"");
  839.                   ListDir(DrawerString.Buffer);
  840.                   break;
  841.              case CHOICECLASS:             /* set the name in string gads */
  842.                   SetNewFile( &FileGadget, gadget->GadgetText->IText );
  843.                   break;
  844.              case DEVICECLASS:             /* Device change */
  845.                   ChangeDevice(gadget);
  846.              }
  847.       }
  848.     }
  849.   return((BOOL)(choice==LOAD));
  850. } /* WaitRequester */
  851.  
  852. /*
  853.  *  SetNewDrawer - Used Mouse to pick directory from selection list gadgets.
  854.  */
  855. void SetNewDrawer(Gadget,Text)
  856.   struct Gadget *Gadget;
  857.   UBYTE  *Text;
  858. {
  859.   SetNewFile(&FileGadget,"");          /* clear file name string */
  860.   SetNewFile(Gadget,Text);             /* set new drawer into gadget */
  861.   ListDir(FRFullPath);                 /* List new files into Sel List */
  862. } /* SetNewDrawer */
  863.  
  864. /*
  865.  *  SetNewFile - Copy text to gadget and refresh
  866. */
  867. void SetNewFile(gadget,Text)
  868.   struct Gadget *gadget;
  869.   UBYTE  *Text;
  870. {
  871.   struct StringInfo *strinfo;
  872.  
  873.   if (strcmp(Text, spaces30) != 0)
  874.     {
  875.     ThrowTrailing(Text);           /* get rid of trailing blanks */
  876.     strinfo = (struct StringInfo *)(gadget->SpecialInfo);
  877.     strcpy(strinfo->Buffer,Text);
  878.     RefreshGadgets(&DownGadget,FRWindow,&FileRequester);
  879.     }
  880. } /* SetNewFile */
  881.  
  882. /*
  883.  *  ListDir - List the directory into array of string names.
  884.  */
  885. void ListDir(dir)
  886.   char *dir;
  887. {
  888.   struct FileLock *my_lock, *Lock() ;
  889.   char templist[STRINGSIZE];
  890.   WORD i, j;
  891.  
  892.   FileCount = 0;
  893.   FirstFile = 0;
  894.  
  895.   if ((my_lock = Lock(dir, ACCESS_READ)) != NULL) {
  896.     if (Examine(my_lock, &FileInfo)) {
  897.       ExNext(my_lock, &FileInfo);
  898.       while (IoErr() != ERROR_NO_MORE_ENTRIES && FileCount < MAXFILES) {
  899.          strcpy(&FileListEntry[FileCount][0], FileInfo.fib_FileName);
  900.          FileCount++;
  901.          ExNext(my_lock, &FileInfo);
  902.       }
  903.       UnLock(my_lock) ;
  904.     }
  905.  
  906.     for (i = 0; i < FileCount-1; ++i)    /* sort alphabetically */
  907.        for (j = i+1; j < FileCount; ++j)
  908.           if (strcmp( FileListEntry[j], FileListEntry[i] ) < 0) {
  909.              strcpy( templist, FileListEntry[i] );
  910.              strcpy( FileListEntry[i], FileListEntry[j] );
  911.              strcpy( FileListEntry[j], templist );
  912.           }
  913.   }
  914.  
  915.   AttachList(FirstFile);
  916.   if (FileCount > 8)
  917.     ModifyProp(&PotGadget,FRWindow,&FileRequester,AUTOKNOB|FREEVERT|PROPBORDERLESS,0,0,0,(ULONG)0xffff*8/FileCount);
  918.   else
  919.     ModifyProp(&PotGadget,FRWindow,&FileRequester,AUTOKNOB|FREEVERT|PROPBORDERLESS,0,0,0,0xffff);
  920. } /* ListDir */
  921.  
  922. /*
  923.  *  AttachList - Attach list of file (directory) names to Selection gadgets
  924.  */
  925. void AttachList(Start)
  926.   USHORT Start;
  927. {
  928.   USHORT Gadget;
  929.  
  930.   for (Gadget = 0; Gadget <= 7 && Gadget+Start < FileCount; Gadget++)
  931.     {
  932.     strcpy(FileList[Gadget].IText,&FileListEntry[Start + Gadget][0]);
  933.     strncat(FileList[Gadget].IText, spaces30, 30-strlen(FileList[Gadget].IText));
  934.     }
  935.   for (; Gadget <= 7; Gadget++)
  936.     strcpy(FileList[Gadget].IText,spaces30);
  937.  
  938.   RefreshGadgets(&DownGadget,FRWindow,&FileRequester);
  939. } /* AttachList */
  940.  
  941. /*
  942.  *  ScrollList - Scroll the list up or down 1 file if possible
  943.  */
  944. void ScrollList(gadget)
  945.   struct Gadget *gadget;
  946. {
  947.   ULONG VertPot = 0;
  948.  
  949.   switch(gadget->GadgetID & GADGETNUM)
  950.     {
  951.     case DOWN:
  952.          if (FileCount > FirstFile + 8)
  953.            ++FirstFile;
  954.          break;
  955.     case UP:
  956.          if (FirstFile > 0)
  957.            --FirstFile;
  958.     }
  959.   if (FileCount > 8)
  960.     VertPot  = MIN(0xffff,((FirstFile<<16))/(FileCount-8));
  961.   ModifyProp(&PotGadget,FRWindow,&FileRequester,AUTOKNOB|FREEVERT|PROPBORDERLESS,0,VertPot,0,KnobInfo.VertBody);
  962.   AttachList(FirstFile);
  963. } /* ScrollList */
  964.  
  965. /*
  966.  *  PotScrollList - Calculate the file number from Pot value and attach
  967.  *                  names to Selector List gadgets.
  968.  */
  969. void PotScrollList(gadget)
  970.   struct Gadget *gadget;
  971. {
  972.   switch (gadget->GadgetID & GADGETNUM)
  973.     {
  974.     case POT:
  975.          FirstFile = ((ULONG)(FileCount-8)*KnobInfo.VertPot+(1<<15)) >> 16;
  976.          AttachList(FirstFile);
  977.     }
  978. } /* PotScrollList */
  979.  
  980. /*
  981.  *  ThrowTrailing - Remove trailing blanks from string
  982.  */
  983. void ThrowTrailing(String)
  984.   UBYTE *String;
  985. {
  986.   SHORT I;
  987.  
  988.   I = strlen(String) - 1;
  989.   while (String[I] == ' ' && I >= 0)
  990.     String[I--] = '\0';
  991. } /* ThrowTrailing */
  992.  
  993. /*
  994.  * ChangeDevice - Change to device chosen by buttons
  995. */
  996. void ChangeDevice(gadget)
  997.   struct Gadget *gadget;
  998.   {
  999.   UBYTE *text;
  1000.  
  1001.   text = DFGadget[gadget->GadgetID & GADGETNUM].GadgetText->IText;
  1002.   strcpy(FRFullPath, text);
  1003.   SetNewDrawer(&DrawerGadget, text);
  1004.   } /* ChangeDevice */
  1005.  
  1006. /*
  1007.  * ToUpper - Convert a string to all upper case
  1008. */
  1009. void ToUpper(text)
  1010.   STRPTR text;
  1011. {
  1012.   ULONG i;
  1013.  
  1014.   for (i=0 ; i < strlen(text) ; i++)
  1015.      *(text+i) = toupper(*(text+i));  /* convert character */
  1016. }  /* ToUpper */
  1017.